﻿using System;
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Waypoint))]
public class WaypointEditor : Editor
{
    private Waypoint WaypointTarget => target as Waypoint;

    /// <summary>
    /// 在场景视图中绘制导航点。
    /// </summary>
    private void OnSceneGUI()
    {
        // 如果导航点数组的长度小于等于0，则不执行任何操作。
        if (WaypointTarget.Point.Length <= 0f)
        {
            return;
        }
        
        // 设置导航点的绘制颜色为红色。
        Handles.color = Color.red;
        
        // 遍历导航点数组。
        for (int i = 0; i < WaypointTarget.Point.Length; i++)
        {
            // 开始检测导航点位置是否有更改。
            EditorGUI.BeginChangeCheck();
            
            // 计算当前导航点的绝对位置。
            Vector3 currentPoint = WaypointTarget.EntityPosition + WaypointTarget.Point[i];
            
            // 绘制可移动的导航点句柄，并获取新的位置。
            Vector3 newPosition =
                Handles.FreeMoveHandle(currentPoint, 0.5f, Vector3.one * 0.5f, Handles.SphereHandleCap);
            
            // 创建一个新的GUI样式对象，用于自定义文本的外观
            GUIStyle text = new GUIStyle();
            // 设置文本为粗体，以突出显示
            text.fontStyle = FontStyle.Bold;
            // 设置文本字体大小为16，确保在一定距离内可读
            text.fontSize = 16;
            // 设置文本颜色为黑色，以适应大多数背景
            text.normal.textColor = Color.black;
            
            // 定义文本相对于目标位置的偏移量，用于优化视觉显示
            Vector3 textPos = new Vector3(0.2f, -0.2f);
            
            // 在编辑器视图中绘制标签，显示当前点的索引
            // 通过添加偏移量来调整文本的位置，使其更易于阅读
            Handles.Label(WaypointTarget.EntityPosition + WaypointTarget.Point[i] + textPos, $"{i + 1}", text);
            
            // 如果导航点位置有更改，则记录更改并更新导航点位置。
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(WaypointTarget, "移动点");
                WaypointTarget.Point[i] = newPosition - WaypointTarget.EntityPosition;
            }
        }
    }
}